#ifndef GY_BUTTON_H
#define GY_BUTTON_H

#include "GY_ContainerTransform.h"
#include "GY_TransformGroup.h"
#include "GY_SimpleGroup.h"
#include "GY_ControlLibrary_global.h"
#include "Graphics/GY_Object.h"
#include "Graphics/BasicGraphics/GY_BasicsGraphicsObject.h"
#include "Graphics/BasicGraphics/GY_GraphicsButtonEditItem.h"
#include <QObject>
#include <QDebug>
#include <QMouseEvent>
#include <QGraphicsPathItem>
#include <QPen>
#include <QPainter>
#include <QGraphicsItem>
#include <QGraphicsScene>


class GY_CONTROLLIBRARY_EXPORT GY_Button : public GY_ContainerTransform
{
    Q_OBJECT
public:
    explicit Q_INVOKABLE GY_Button(const QString &guid,QGraphicsItem *parent = nullptr);
    /**
     * @brief addItem 组中添加图元
     * @param pItem
     * @return
     */
    virtual bool addItem(GY_Object *pItem);
    //!继承基类重写
    GY_Object * copyItem(const QString &guid = QString());
    /**
     * @brief removeItem 移除组中图元
     * @param pItem
     * @return
     */
    virtual bool removeItem(GY_Object *pItem);
private:
    /**
     * @brief m_ObjectItems 存放图元对象编号于vector
     */
    QVector<GY_Object *> m_ObjectItems;
    /**
     * @brief currentIndex 当前图元对象在vector中的索引
     */
    int currentIndex = 0;//初始化数组下标，默认从零开始
    /**
     * @brief graphicsPathItem 绘制button容器的矩形区域
     */
    GY_GraphicsButtonEditItem *graphicsPathItem = new GY_GraphicsButtonEditItem;

    GY_Object *m_Items;
    /**
     * @brief updateIsVisible 更新可见度
     * @param value
     * @return
     */
    bool updateIsVisible(const QString &name, const QVariant &value);
    /**
     * @brief updatePosition 更新位置点
     * @param name
     * @param value
     * @return
     */
    bool updatePosition(const QString &name,const QVariant &value);
    /**
     * @brief updateActiveArea 更新容器激活范围
     * @param name
     * @param value
     * @return
     */
    bool updateActiveAreaLeft(const QString &name,const QVariant &value);
    bool updateActiveAreaBottom(const QString &name,const QVariant &value);
    bool updateActiveAreaRight(const QString &name,const QVariant &value);
    bool updateActiveAreaTop(const QString &name,const QVariant &value);
    /**
     * @brief updateCurrentState 更新容器当前状态编号（当前容器的编号）
     * @param name
     * @param value
     * @return
     */
    bool updateCurrentState(const QString &name,const QVariant &value);
    /**
     * @brief updateNumberOfStates 更新状态数量（button所嵌套的容器数量）
     * @param name
     * @param value
     * @return
     */
    bool updateNumberOfStates(const QString &name,const QVariant &value);
    /**
     * @brief updateShowAllStates 更新是否显示所有状态
     * @param name
     * @param value
     * @return
     */
    bool updateShowAllStates(const QString &name,const QVariant &value);
    /**
     * @brief updatePoint 更新容器激活区域编辑点
     * @param name
     * @param value
     * @return
     */
    bool updatePoint(const QString &name,const QVariant &value);
    /**
     * @brief updatePath
     * @param left
     * @param right
     * @param top
     * @param bottom
     */
    void updatePath(const qreal &left,const qreal &right,const qreal &top,const qreal &bottom);

    void updateDraw();
    /**
     * @brief initializationPropertyInfo 初始化属性信息
     */
    void initializationPropertyInfo();

private:
    GY_TransformGroup* m_pTransFormGroup;

private slots:
    /**
     * @brief recvDoubleClicked 接收鼠标双击事件信号的槽
     */
    void recvDoubleClicked();

signals:

};

#endif // GY_BUTTON_H
